昨天我們知道:暫存器定址、立即定址、記憶體定址,是CPU 透過匯流排與記憶體互動時的不同方法。今天,來說明記憶體的定址方式。
分成三類,直接存取、直接偏移與間接存取。
顧名思義,就是透過記憶體位置直接存取
該資料。不過這樣的方式有個缺點,就是存取速度較為緩慢
,因為系統需要多花費運算去找到該記憶體位置,縱然比較直觀。其語法如下,
ADD BYTE_VALUE, DL
MOV BX, WORD_VALUE
;e.g.
ADD 0xffff0567, DL
MOV BX, 0xffff4231
我們可以看到,不管是將記憶體的資料移動到暫存器或相反,都行得通。
直接偏移就是透過運算的方式存取記憶體資料。舉下圖來說明。首先,第1-2行,定義兩個表格,分別是 byte 與 word,裡頭分別儲存一些數值。接著,我們可以透過中括弧或是+號等數學符號進行資料的存取(可以把它想像陣列的存取方式
)。第4-5行都是存取 BYTE_TABLE 的的第三欄位(因為存取的位置是從0起算)的資料(也就是22這個數值),而第6-7行存取的是 WORD_TABLE 的第四欄位的資料(也就是123這個數值)。
BYTE_TABLE DB 14, 15, 22, 45
WORD_TABLE DW 134, 345, 564, 123
MOV CL, BYTE_TABLE[2]
MOV CL, BYTE_TABLE + 2
MOV CX, WORD_TABLE[3]
MOV CX, WORD_TABLE + 3
間接存取就是透過[暫存器](被括弧的暫存器)來進行陣列的存取。舉例如下,第1行,先配置一個10個 word (每個 word 佔 2 bytes )的空間名稱為 MY_TABLE,並且將每個數值初始化為0。第2行,將 MY_TABLE 的第一個元素的記憶體位址存到 EBX (透過[]可以取得該變數的記憶體位置
)。接著,第3行,將110存入 MY_TABLE[0](等同:MY_TABLE[0] = 110),第4行,將 EBX+2,意思是說,將 EBX 移動到下個元素的記憶體位置(注意因為,每個 word 為兩個 byte,若定義為ㄧ個 byte,EBX+1 就好)。最後,第5行,將123存入 MY_TABLE[1](等同:MY_TABLE[1] = 123)。
不難發現,間接存取就是透過 EBX 來取代陣列的存取。
MY_TABLE TIMES 10 DW 0
MOV EBX, [MY_TABLE]
MOV [EBX], 110
ADD EBX, 2
MOV [EBX], 123
恭喜閱讀完記憶體的存取方式!明日正式進入各式的組合語言指令介紹~